/*
 * Copyright 北京航空航天大学  @ 2015 版权所有
 */
package com.buaa.edu.leetcode.algorithm.string;

import static org.junit.Assert.*;

import org.junit.Test;

/**
 * <p>
 * 数字验证
 *  "0" => true 
 *  " 0.1 " => true 
 *  "abc" => false 
 *  "1 a" => false 
 *  "2e10" => true
 * </p>
 * 
 * @author towan
 * @email tongwenzide@163.com
 * @time 2015年6月14日
 */
public class ValidNumber {
    // 需要考虑正负符号、小数点、e等
    public boolean isNumber(String s) {
        boolean result = false;
        if (s == null) {
            return result;
        }
            s =  s.trim();
            if (s.equals("")) {
                return result;
            }
            // //需要考虑正负符号、小数点、e等
            boolean hasSign = false;
            boolean hasDot = false;
            Boolean hasExp = false;
            Boolean hasDigit = false;
            s = s.toLowerCase();

            int len = s.length();
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                // 判断是否是合法字符，数字、正负号、小数点、指数等
                if (!isValid(c)) {
                    return false;
                }
                switch (c) {
                    case '+':
                    case '-':
                        if ((i != 0 && s.charAt(i - 1) != 'e') || i == len - 1) {
                            return false;
                        } else {
                            hasSign = true;
                        }
                        break;
                    case '.':
                        //只有一个字符情况，只有符号和点；在e和点之后
                        if(len==1 || (len==2 && hasSign) || hasExp || hasDot){
                            return false;
                        }else{
                            hasDot = true;
                        }
                        break;
                    case 'e':
                        //出现在第一个或最后一个 字符；前面没有数字；前面有e了
                        if(i==0 || i==len-1 || !hasDigit || hasExp){
                            return false;
                        }else{
                            hasExp = true;
                        }
                        break;

                    default:
                        hasDigit = true;
                        break;
                }
            }
            return true;
        }
    /**
     * 判断是否是合法的字符
     * @param c
     * @return
     * @author towan
     * 2015年6月14日
     */
    private boolean isValid(char c) {
        if(c=='+' || c=='-' || c=='.' || c=='e' || (c>='0' && c<='9')){
            return true;
        }
        return false;
    }
    
    @Test
    public void test1(){
        assertTrue("fail",isNumber("0"));
        assertTrue("fail",isNumber("2e10"));
        assertTrue("fail",isNumber("0.1"));
        assertFalse("fail", isNumber("abc"));
        assertFalse("fail", isNumber("1 a"));
        assertFalse("fail", isNumber("ebc"));
      
    }
}
